package com.zenithmind.note.pojo.valueobject;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 笔记统计信息值对象
 * 
 * @author ZenithMind
 * @since 2024-01-01
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NoteStatistics {
    
    /**
     * 浏览次数
     */
    private Integer viewCount;
    
    /**
     * 点赞次数
     */
    private Integer likeCount;
    
    /**
     * 评论次数
     */
    private Integer commentCount;
    
    /**
     * 收藏次数
     */
    private Integer favoriteCount;
    
    /**
     * 分享次数
     */
    private Integer shareCount;
    
    /**
     * 增加浏览次数
     * 
     * @param increment 增量
     * @return 新的统计对象
     */
    public NoteStatistics incrementViewCount(int increment) {
        if (increment < 0) {
            throw new IllegalArgumentException("增量不能为负数");
        }
        
        return NoteStatistics.builder()
                .viewCount(this.viewCount + increment)
                .likeCount(this.likeCount)
                .commentCount(this.commentCount)
                .favoriteCount(this.favoriteCount)
                .shareCount(this.shareCount)
                .build();
    }
    
    /**
     * 增加点赞次数
     * 
     * @param increment 增量（可以为负数表示取消点赞）
     * @return 新的统计对象
     */
    public NoteStatistics incrementLikeCount(int increment) {
        int newLikeCount = Math.max(0, this.likeCount + increment);
        
        return NoteStatistics.builder()
                .viewCount(this.viewCount)
                .likeCount(newLikeCount)
                .commentCount(this.commentCount)
                .favoriteCount(this.favoriteCount)
                .shareCount(this.shareCount)
                .build();
    }
    
    /**
     * 增加评论次数
     * 
     * @param increment 增量（可以为负数表示删除评论）
     * @return 新的统计对象
     */
    public NoteStatistics incrementCommentCount(int increment) {
        int newCommentCount = Math.max(0, this.commentCount + increment);
        
        return NoteStatistics.builder()
                .viewCount(this.viewCount)
                .likeCount(this.likeCount)
                .commentCount(newCommentCount)
                .favoriteCount(this.favoriteCount)
                .shareCount(this.shareCount)
                .build();
    }
    
    /**
     * 增加收藏次数
     * 
     * @param increment 增量（可以为负数表示取消收藏）
     * @return 新的统计对象
     */
    public NoteStatistics incrementFavoriteCount(int increment) {
        int newFavoriteCount = Math.max(0, this.favoriteCount + increment);
        
        return NoteStatistics.builder()
                .viewCount(this.viewCount)
                .likeCount(this.likeCount)
                .commentCount(this.commentCount)
                .favoriteCount(newFavoriteCount)
                .shareCount(this.shareCount)
                .build();
    }
    
    /**
     * 增加分享次数
     * 
     * @param increment 增量
     * @return 新的统计对象
     */
    public NoteStatistics incrementShareCount(int increment) {
        if (increment < 0) {
            throw new IllegalArgumentException("分享次数增量不能为负数");
        }
        
        int newShareCount = this.shareCount + increment;
        
        return NoteStatistics.builder()
                .viewCount(this.viewCount)
                .likeCount(this.likeCount)
                .commentCount(this.commentCount)
                .favoriteCount(this.favoriteCount)
                .shareCount(newShareCount)
                .build();
    }
    
    /**
     * 获取总互动次数
     * 
     * @return 总互动次数
     */
    public Integer getTotalInteractions() {
        return likeCount + commentCount + favoriteCount + shareCount;
    }
    
    /**
     * 计算热度分数（简单算法）
     * 
     * @return 热度分数
     */
    public Double getHotScore() {
        // 简单的热度计算：浏览*0.1 + 点赞*2 + 评论*3 + 收藏*4 + 分享*5
        return viewCount * 0.1 + likeCount * 2.0 + commentCount * 3.0 + 
               favoriteCount * 4.0 + shareCount * 5.0;
    }
}
